/**
 * 受信データ登録クラス
 * @author h_kato 
 * @version 0.9.0
 * @see SwwMessagingAdapter.java
 */
package jp.ac.aiit.yc.sww;


import flex.messaging.messages.AsyncMessage;

import java.sql.*;	

import javax.sql.*;
import javax.naming.*;

public class DataRegister {	
																								
	private static String OP_DRAW = "draw";	//　送受信メッセージの種類を示す(書き込み)	
	//private static String OP_COLOR = "color";	//　送受信メッセージの種類を示す(色情報)　
	private static String OP_PAGE = "page";	// 送受信メッセージの種類を示す(画像)				
	private static String OP_CLEAR_TRAILS = "clear_trails";	//　送受信メッセージの種類を示す(消去)
	private static String OP_MODE = "mode";	// タブの切り替え
	private static String OP_STICKY = "sticky"; // テキストボックス
	
	private Connection con;
	
	/**
	 * コンストラクタ
	 * データソースからDBコネクションを作成します。
	 * @param none
	 * @return none
	 */
	public DataRegister(){
			try{
				//initialContextを作る。
				InitialContext initCon = new InitialContext(); 
				      
				//データソースを作成する。
				DataSource ds 
				    = (DataSource)initCon.lookup("java:comp/env/jdbc/sww"); 
				
				//データソースからコネクションを作成する。
				con = ds.getConnection();
				
			}catch(Exception ex){
				System.out.println(ex.toString());
			}
		
	}
	
	/**
	 * デコンストラクタ
	 * DBコネクションクローズを行います。
	 * @param none
	 * @return none
	 */
	public void finalize() {
		try{			
			//データベースのクローズ;
			if(!con.isClosed()){			
				con.close();
			}
		}catch(Exception ex){
			System.out.println(ex.toString());
		}
	}
	

	
	/**
	 * データ登録メソッド(本体)
	 * @param AsyncMessage 受信メッセージ
	 * @param String 受信メッセージ内の操作
	 * @return int 実行結果
	 */	
	public int registerData(AsyncMessage message, String operation){
		
		int rslt = 0;
		
		try{		
			
			System.out.println("registerData:Start");
			
			//ユーザ
    		String username = "none";
    		if (message.getHeader("user") != null)
    		{ 
    			username = message.getHeader("user").toString();
    		}
			//会議室名
			String meeting_room_id = "none";
			if (message.getHeader("room") != null)
    		{ 
    			meeting_room_id = message.getHeader("room").toString();
    		}
			//ページ
			Integer page_id = 0;
			if (message.getHeader("page") != null)
    		{ 
    			page_id = Integer.parseInt(message.getHeader("page").toString());
    		}
			
			System.out.println("page:" + page_id + " room:" + meeting_room_id + " user:"+ username);
			
			//処理名によってモジュールを呼び出す。
			if(operation.equals(OP_DRAW)){			//描線
				rslt = registDrawData(message, username, meeting_room_id, page_id);
				
			}else if(operation.equals(OP_PAGE)){		//ドキュメントページ変更
				rslt = registDocData(username, meeting_room_id, page_id);
				
			}else if(operation.equals(OP_CLEAR_TRAILS)){		//消去
				rslt = registClearData(username, meeting_room_id, page_id);
				
			}else if(operation.equals(OP_MODE)){		//モード切替				
				rslt = registModeData(message, username, meeting_room_id);
			}else if(operation.equals(OP_STICKY)){	//テキストボックス
				
				NoteData noteBody = (NoteData)message.getBody();
				System.out.println(" point :" + noteBody.getX() + " " + noteBody.getY() + 
						           " size:" + noteBody.getWidth() + " " + noteBody.getHeight());
				
			}
			System.out.println("registerData:End" );
			
		}catch(Exception ex){
			System.out.println(ex.toString());
		}
		
		return rslt;		

	}
	

	/**
	 * 描線データの登録
	 * @param AsyncMessage	受信メッセージ
	 * @param String 		送信者名
	 * @return int 		実行結果
	 */	
	private int registDrawData(AsyncMessage message, String username, String roomid, Integer pageid){
		int rslt = 0;
		
		try{
			
			//メッセージボディ取得
			DrawData messageBody = (DrawData)message.getBody();
			
			System.out.println("registDrawData:getBody:" + messageBody.getClass());
						
			//太さ
			Long thickness =(Long)messageBody.getThickness();
			Long color = (Long)messageBody.getColor();
			
			if (messageBody.getArryPoint() != null){
			
				
				String strpoint = messageBody.getArryPoint();
				
				System.out.println("color:" + color + " thickness:" + thickness + " point:" + strpoint);
				
				//呼び出すプロシージャの設定
				String sql = "{call sp_draw_event(?, ?, ?, ?, ? ,?)}";
				
				//プロシージャステートメントの作成			
				CallableStatement cStmt = con.prepareCall(sql);
				
				//プロシージャ引数の設定
				cStmt.setString(1, username);
				cStmt.setString(2, roomid);
				cStmt.setInt(3, pageid);
				cStmt.setLong(4, color);
				cStmt.setLong(5, thickness);
				cStmt.setString(6, strpoint);
				
				//プロシージャ実行
				boolean ret = cStmt.execute();
	    		
				//プロシージャステートメントクローズ
				cStmt.close();	
				
				
				if (!ret){
					rslt = -1;
				}
				
			}			
			
		}catch(Exception ex){
			System.out.println(ex.toString());
		}
		return rslt;
		
	}
	

	/**
	 * ドキュメントページの登録
	 * @param AsyncMessage	受信メッセージ
	 * @param String 		送信者名
	 * @return int 		実行結果 
	 */	
	private int registDocData(String username, String roomid, Integer pageid){
		int rslt = 0;
		
		try{
			
			//呼び出すプロシージャの設定
			String sql = "{call sp_page_event(?, ?, ?)}";
			
			//プロシージャステートメントの作成			
			CallableStatement cStmt = con.prepareCall(sql);
			
			//プロシージャ引数の設定
			cStmt.setString(1, username);
			cStmt.setString(2, roomid);
			cStmt.setInt(3, pageid);
			
			//プロシージャ実行
			boolean ret = cStmt.execute();
    		
			//プロシージャステートメントクローズ
			cStmt.close();	
			
			if (!ret){
				rslt = -1;
			}
			
		}catch(Exception ex){
			System.out.println(ex.toString());
		}
		return rslt;
	}
	

	/**
	 * クリアデータの登録
	 * @param AsyncMessage	受信メッセージ
	 * @param String 		送信者名
	 * @return int 		実行結果
	 */	
	private int registClearData(String username, String roomid, Integer pageid){
		int rslt = 0;
		
		try{
			
			//呼び出すプロシージャの設定
			String sql = "{call sp_clear_event(?, ?, ?)}";
			
			//プロシージャステートメントの作成			
			CallableStatement cStmt = con.prepareCall(sql);
			
			//プロシージャ引数の設定
			cStmt.setString(1, username);
			cStmt.setString(2, roomid);
			cStmt.setInt(3, pageid);
    				
			//プロシージャ実行
			boolean ret = cStmt.execute();
    		
			//プロシージャステートメントクローズ
			cStmt.close();	
			
			if (!ret){
				rslt = -1;
			}
			
		}catch(Exception ex){
			System.out.println(ex.toString());
		}
		return rslt;
	}
	

	/**
	 * タブデータの登録
	 * @param AsyncMessage	受信メッセージ
	 * @param String 		送信者名
	 * @return int 		実行結果
	 */
	private int registModeData(AsyncMessage message, String username, String roomid){
		int rslt = 0;
		
		try{
			//メッセージボディ取得
			Object tmp = message.getBody();
			
			Integer mode = (Integer) tmp;
		
			//呼び出すプロシージャの設定
			String sql = "{call sp_mode_event(?, ?, ?)}";
			
			//プロシージャステートメントの作成			
			CallableStatement cStmt = con.prepareCall(sql);
			
			//プロシージャ引数の設定
			cStmt.setString(1, username);
			cStmt.setString(2, roomid);
			cStmt.setInt(3, mode);
    				
			//プロシージャ実行
			boolean ret = cStmt.execute();
    		
			//プロシージャステートメントクローズ
			cStmt.close();	
			
			if (!ret){
				rslt = -1;
			}
		}catch(Exception ex){
			System.out.println(ex.toString());
		}
		return rslt;
	}	
}
